




*********************************** 
Jedi Knight: Jedi Academy 
*********************************** 

TITLE: ChatScript: console reader API scriptrunner

AUTHOR: Robo85045 (in-game name: .:MOO:.Phred|MS|)


E-MAIL: robo85045(4)cox(1)net
(replace the (4) with @ and (1) with .  I dont want any e-mail harvesting bots to grab it and sell it off to advertisers...)
my email is rarely checked, if you want to contact me, do so through the lugormod forums or my msn name (same as my email addr)

		
WEBSITE: 
http://bwap.pipobona.com/profile.php?mode=viewprofile&u=9
http://lugor.mine.nu/phpBB2/profile.php?mode=viewprofile&u=541
(Im too lazy to set up a real website...)
			
CREDITS: 
MHGameWork for the vb source of a simple chat reader, which I converted into c++.  Winamp, for their wonderful plugin dlls that DONT ACTUALY NEED WINAMP TO RUN
Darth NormaN, for a copy/paist of the legal disclaimer from a readme of one of his maps.


INSTALLATION INSTRUCTIONS: 
the program doesnt care where you put it really, as long as all files and folders included are in the same	directory.  just unzip everything to a dir, and it should arrange them in the right folders.




ChatScript: console response script
Made by .:MOO:.Phred|MS| (robo85045)


---------------------------------------------------------------

IF ALL YOU WANT IS A KILLTRACKER, USE JAMTRACKER (http://www.jamtracker.co.uk)
this program is designed for thoes who want to add custom commands for one reason or another.  It was made purely for me to practice programming, and was releaced just because it seemed generaly usefull. usage of this program requires logical thinking and scripting. so if you can't understand scripting or think logicaly, dont download this.

as of version 1.4, this program WILL WORK alongside Jamtracker


---------------------------------------------------------------


A simple ms-dos program that reads its responses from a user created text file.  It supports variables and other functions that allow you to create a killtracker or chat scanner the way you want it.

this program was made just as an exparement on my part, so it might not be fully stable. The scripting of this is not for thoes who are not good at logic, so if all you want is a basic killtracker and dont want to add any other commands to it, then go for one of the other vb kts out there.

The scripting system is fairly basic, the scripts are stored in a file called "responses.cscr" in text format in the same dir the program is in.  if this file is not found the program will ask you for the file path of the file you want it to load.

---------------------------------------------------------------

If you want to perminetly set your name in the program, add this line to your responses.cscr file:

var "NAME" "[CLAN]Player{Rank}"

Oviously, you should include your real in-game name

---------------------------------------------------------------

<1.4 changes>
Changed chat scanning code to allow it to work with other killtrackers that do not modify the mpconsole window.
instant messanger support still too erratic, disabled for this releace.
removed all recreations of jamtracker cmds from the example response script (no longer needed)
added "event" functions
now including 2 .cscr files: a standalone example one, and one basic one to add to.

<1.3 changes>
started on msn/aim connection stuff

<1.2 changes>
Fixed a glitch in the %% function tags
Program no longer shuts down if the winamp dlls cant be loaded. (winamp functions will not work if this happens, oviously)
showconsole and hideconsole are now combined.
Slightly tweaked the script file format for the ChatScript Editor interface.


---------------------------------------------------------------

Included respoce scripts:

responsesSTANDALONE.cscr:
	this was the origional one I made that uses the same command names as jamtracker.  After I got the program
	working alongside jamtracker this became unneeded.  I am including it only for examples on how to do some
	more advanced functions.  This also has some winamp functions set up, although winamp is disabled in the
	program right now.

responses.cscr:
	this is the response file you should add to.  It includes a few cmds, mostly debugging stuff and other
	cmds i've made to screw around with.



---------------------------------------------------------------

basic script usage:

any line starting with a '#' is ignored by the file reader, so you can store notes inside the file

#basic script file
#testing


each chat response is declaired by the 'response' keyword:

response "abacad"

this will start a 'stack' of statements, where every command after this and before its 'end' command will be done if the chat string matches.  The example code above will fire only if it sees 'abacad' in the console. NOT player: abacad, but just 'abacad', as in the result of the command '/echo abacad'



to get it to respond to YOU saying a command, do response "YourName: abacad" although you could make all your responses have your name in them, you wouldnt be able to easily change your name.  this is one of the many uses of variables:

var "VarName" "Default Value"

the value of variables are placed into the string by surrounding it with '$' symbols, for example

var "NAME" "Phred"
response "$NAME$: abacad"

since the word NAME is in '$' symbols, the response will first place the value of the 'NAME' var into it before comparing the string, so the above response will be fired by

Phred: abacad


you can also set variables inside the response string by using '&', for example a !notes cmd

response "$NAME$: !notes &arg&"

if the player says "!notes test", then the variable 'arg' will be set to the value 'test' if the variable you are trying to set doesnt exist, it will create it for you as a temporary variable (it will be deleted when the response ends)

back on to the basic structure of scripting, all stacks must have and end somewhere. Tell the compiler to end the current stack by the 'end' command.

Response "$NAME$: Do Somthing"
	#do stuff
end

every stacked cmd (response, ifstr, iflst, ifint, thread) MUST have a corisponding 'end' cmd


on to some basic commands:

to send chat to the server, use the 'chat' command.

response "$NAME$: echo &arg>>&"
	chat "$arg$"
end

Phred: echo asdf
response:
Phred: asdf

not the most usefull command, but it shows the basic usage.  note that the variable arg has '>>' at the end of it.  that makes it grab everything there is in the list.  if that wasnt there then it would only grab the first word in that position, so you wouldnt be able to hold multiple words in the var without it.

when using &arg&
Phred: echo asdf fdsa
value of 'arg': asdf

when using &arg>>&
Phred: echo asdf fdsa
value of 'arg': asdf fdsa

if you tried the above echo example on a public server, you might have noticed that even though it send the chat, it was never shown on the server.  this is because most servers have the cvar sv_floodprotect set to 1, which prevents you from sending commands faster than once a seccond or so.  to get past this, you can make the response be delayed with the 'sleep' function

response "$NAME$: echo &arg>>&"
	sleep "1000"
	chat "$arg$"
end

the sleep function will pause the program for the miliseconds specified.  1000 milisecconds is equivalent to 1 seccond.

with the above example, the program will literaly freeze for 1 seccond.  what if another chat event happens during this time?  the program will read all the past chat events from the console and continue with them and everything will be fine.  great, but just because I randomly do things on impulse, i desided to include a 'thread' command a 'thread' is basicly a sub-program inside a larger program.  threads can only do one thing at a time, and this is why the program cant do anything while in a 'sleep' command.  it cant pause itself while continuing to check for chat events. the 'thread' command starts a stack that is ran in a seperate thread which runs parellel to the main program.  this has the benifite in which you can make loops (with the for or do cmd, more on that later) and becomes highly critical when making larger responses.

response "$NAME$: echo3 &arg>>&"
	thread
		sleep "1000"
		chat "$arg$"
		sleep "1000"
		chat "$arg$"
		sleep "1000"
		chat "$arg$"
	end
end

this command will echo whatever you specify 3 times, yet will still be able to take other commands while the echo3 cmd is still running.  note that the 'thread' command has its own 'end' statement, as it is a stack command.

it is possible using the response command to get other peoples chat as well just by using what you have learned so far

response "&CHATTERNAME?: &: &chat>>&

end

there is a new trick here, the variable set CHATTERNAME has something odd at the end: "?: ".  variable sets normaly set the variable to everything up to the next spacebar character.  this would mean that our CHATTERNAME var would become "Phred:", instead of "Phred".  the '?' symbol, when used inside a variable set (&) group, makes the var stop at the specified string instead of at the next space.  note that we have ours set to ': ',  if we just did ':', then it would screw up on peoples names that have a colon in them:
chat "Test::Name: hey"
CHATTERNAME set to "Test" but since we have a space after our colon in the check string, it will only stop when it finds bolth the colon and the space characters next to eachother. note that it STOPS reading at that point, it doesnt actualy read the ': ' part,so you must still include the ': ' in the rest of the chat string. you can use this same tecnique on response strings with the '$' vars, to compare a chunk of their chat to the var instead of the whole word of the chat.


private chat? no problem:

response "[&CHATTER?]: &]:***"
	
end

in this, our stop string for the CHATTER var is "]: "
the three astricts means anything can go there.  a single astrict means any word, 3 means anything at all, so if the chat matched up to that point, then do the response.

the above response will get any private chat, including your own.  so what if we want to reply to private chat with private chat of our own?  it will loop on forever, so you need to make shure the chat we have isnt our own.

we can do this by using 2 functions: IfStr, and Return.  the IfStr will compare 2 strings ('string' is a sequence of letters and other symbols), and will either enter its stacked commands, or skip them baised on the result.  the 'return' function will stop the current response and quit out of it (it will continue to check other responses though) see more on the commands and their args later in this document.

response "[&CHATTER?]: &]:***"
	ifstr "$CHATTER$" "=" "$NAME$"
		return
	end
	tell "$CHATTER$" "abacad"	
end


the 'response' command is fully generic, that means you can check any text that comes into the console, weather it is player chat or not.  for instance, to check to see if someone killed your player:

response "$NAME$ was * by &killer&"
	chat "curse you $killer$!"
end

the '*' is because the kill type can vary (killed, bludgoned, tripped, et al) if you want it to reply differently to different 

remember, the example will not work on a server with floodprotect on, so you should use the trick mentioned before making a new thread and a delay before the chat.

keeping track of the number of kills or deaths is easy, just use a variable for it

response "$NAME$ was * by &killer&"
	varmath "DEATHS" "$DEATHS$" "+" "1"
	chat "curse you $killer$!"
end

remember, you need to delcair the 'DEATHS' var using the 'var' command.  see the command list for info on how to do this.








my apologies for the quality of the folowing info, as im not at all well.






The program is also capable of storing lists of text.  declair a list using:

list "GenericList"

a special 'if' statement exists to check if a certain string of text is in a list var

IfLst "GenericList" "SomeRandomText"

if the text is equal to one of the list items, it does its stack.

to get the number of items in a list:

listcount "GenericList" "ResultVar"

you can get the value of the list in a specified position by

listindex "GenericList" "3" "ResultVar"

where '3' is the number index you want to read from

here is a sample from the included response.txt that will list
all entries in the 'Buddies' list

	tmpvar "lstcount" "0"
	tmpvar "lst" " "
	listcount "Buddies" "lstcount"
	varmath "lstcount" "$lstcount$" "-" "1"
	ifint "$lstcount$" "=" "-1"
		cmd "echo \"no buddies added\""
		return
	end
	for "index" "0" "$lstcount$"
		listindex "Buddies" "$index$" "lst"
		cmd "echo \"$index$: $lst$\""
	end




---------------------------------------------------------------
WINAMP STUFF (winamp is no longer included in this version.  It might be back later if enough people request it
---------------------------------------------------------------

Winamp dlls, contrary to popular belief, dont actualy require winamp to be installed. Ive included winamp support after being prodded repeatedly with a stick by a friend who thought that a requirement for any good jedi academy chat reader/replier was the ability to control winamp (and.. if i had the time... windows media player, and some ipod thing.... if he hits me with the stick hard enough i MIGHT include it in another version).  Anyway, ive included basic winamp functionality just for the heck of it.

to start up winamp, do:

winampload "dll path"

dll path is the location of the winamp plugin dlls.  if you have winamp installed, set it to the the 'plugins' directory of your winamp instalation.
of course, ive included a few relevant winamp plugin dlls, so if you dont have winamp, just set it to

winampload "winampdlls"

you had to have copied over the 'winampdlls' folder out of the zip file properly to have this work.

after that, its just a matter of calling the right functions to play/stop/rewind/seek the winamp player.  I was going to include a repeat command, but some odd error kept comming up.  if enough people care about this program.  I will include it in a later version.
to see the winamp functions, scroll down a bit.


---------------------------------------------------------------


==============
Command list:
==============
general info:

commands are case insensitive

all args must be surrounded by quotes (")

if you want an arg to include the " char, do \" in its place.
if you want an arg to include the \ char, do \\ in its place.

all stack commands must have a corrisponding 'end' command

if an arg is a variable name, do NOT include the '$' unless you want the arg to be the contense of the var.

all values work with the 'get variable' format ($var$), and the 'get function' format (%function%)

if a command has 'stack cmd' in it, that means that it runs a group of code inside it for one purpose or another.  these must be ended with 'end'

if a command has 'external', that means that the command must be called outside of any stack commands.

if a commands fails or a problem occures, the var LastError is set to a short description and the "ERROR" event is called.
most commands dont use this, it was only added when I started with the winamp and file commands.
it will be used more often in future versions

any commands marked VERSION SPECIFIC will not work on all versions of the program.

list:

winampvolume <volume>

	VERSION SPECIFIC
	
	sets the volume of winamp.  will fail if 'winampload' was never called
	volume must be between 0 and 255

writetofile <file> <mode> <text>
	writes data to a file
	
	file - the file name to write to, if C:\ is missing, it writes
	to a file in the same directory as the program.  the file will
	create a new file if the given one doesnt exist.
	
	mode - must be either "OVERRIDE" or "APPEND".  this is case sensitive.
	OVERRIDE will delete the file and create a new one
	APPEND will write the data to the end of the file, keeping the origional
	data if the file allready existed
	
	text - text string to write.
	
showconsole <1 or 0>
	this commands shows the 'mpconsole'.  this isnt the shift + ~ console, but the
	actual console that is displayed when the game first starts up.  this is kinda useless,
	as the chatscan deletes the text from it as it reads it (so it isnt retriggered by the
	same chat line repeatedly).  this was included for testing of the program, but I'm leaving
	it in.	

winamppause <paused>

	VERSION SPECIFIC
	
	pauses/unpauses the current song
	pause must be 0 (unpaused) or 1 (paused)

stringfunc <string> <mode> <result>
	performs various string functions 
	string - the source string
	mode - function to do, must be LENGTH or APPEND
	result - variable to store result in
	
	if mode is LENGTH, result becomes the number of letters in string
	if mode is APPEND, the string is attached to the end of result

winampseek <time>

	VERSION SPECIFIC
	
	if winampload was never called, this fails
	sets the play position to the specified time
	time is in miliseconds, 1 seccond is 1000 miliseconds
	
winampplay <file path>

	VERSION SPECIFIC
	
	plays the specified file, fails if winampload was never called
	
winampload
	
	VERSION SPECIFIC
	
	external
	
	loads the winamp dlls and gets them ready to play files
	
winampstop

	VERSION SPECIFIC
	
	stops playing
	
listfiles <file format string> <list>
	adds all files matching the format to the list var.
	this was origionaly for the winamp playlist, til i decided it was stupid and did it another way
	
	file format can have astricts as wildcards in the file name part only:
	"C:\music\*.mp3"
	
loadlists <filename>

	external
	
	this loads the list vars saved to the file.  if a list var was already defined when loading,
	it doesnt load that specific list and continues on
	
savelists <filename>
	saves all list vars to a file
	
lstremove <list name>
	removes the specified list
	
listindex <list name> <index> <variable to store result>
	gets the text located in the specified index of the specified list and
	sets the given variable to it.  if the given variable doesnt exist, it
	creates a temporary var to store the text in. (the variable will be deleted
	after the response finishes)
	
listcount <list> <result var>
	returns the number of items in the specified list and stores the result in the 
	specified var.  if the given variable doesnt exist, it
	creates a temporary var to store the text in. (the variable will be deleted
	
minimise
	minimises the jka window
	
loadvars <filename>

	external
	
	loads the vars saved in the specified file.  if a var already exists by the same name
	when it is loading the vars, the vars value is set to the value in the file.
	
savevars <filename>
	saves all vars to a file
	
response <respone string>
	
	stack cmd
	
	you cannot have a response command inside another response stack
	
	compares the chat string to the specified string.
	
	the chat string is case insensitive
	
	if it has a single astrict (*) in the string, it skips the word.
	
	in the chat string that is at the same position as the astrict (word count position).
	
	if it encounters three astricts (***), then it skips the rest of the chat string and
	start the response.
	
	the '&var&' format will set the specified variable to the corisponding word in the string
	if you add '>>' after the var name, it will set the var to the entire rest of the string
	and start the response.
	
	the '%function%' format will compare the chat string at its position to the result of the
	specified function.
	
	the '$var$' format will compare the chat string at its position to the contense of the
	specified var.

tolower <string> <result var>
	converts the string to lowercase and stores the value in the result var
	
varmath <result var> <arg1> <operation> <arg2>
	this command will do a math operations on 2 different values and place the result in
	the result var.
	
	result var - the variable name to place the result in.
	
	var 1 - the first number of the operation, can be the number or a format ($var$, %function%)
	
	operation - the math operation to preform, valid values are: +, -, /, *
	
	var 2 - the seccond number of the operation, can be the number or a format ($var$, %function%)
	
getfile <file format> <result var>
	finds the specified file using wildcards and sets its name to the result var
	
	if the file doesnt exist, then the result var becomes NOTFOUND
	
	if more than 1 file matching is found, then the first file found is returned to result var
	and LastError is set to "more than one file found matching the name"

thread

	stack cmd
	
	starts a new program thread to do the commands inside of it
	
lstadd <list> <value>
	adds the specified value to the list
	
return
	stop the current response and continue doing others (if there are any others)
	
tmpvar <var name> <value>
	creates a temporary variable within the response.
	the variable will be deleted when the stack ends
	
setvar <var name> <value>
	sets the specified variable to the value.  variable must already exist
	
	
	
	{"ifstrl", CmdSet_IfStrl},
	
	
event <event text>

	stack cmd

	this is eqivalent to the "response" cmd, but it works for events that cannot be found in 
	the mp console window.
	
	current valid events:
	
	event "STARTUP" -- runs whenever the program finds the jamp console window.
	event "ERROR" -- called whenever an error occures in the script.  get the error from the
					variable "LastError" (remember, variables are case-sensitive)
	
	
	
sleep <time in miliseconds>
	freeze the current thread (or the program, if not in a thread) for the specified
	number of miliseconds.  1 seccond is equal to 1000 miliseconds.
	
ifint <value 1> <operation> <value 2>

	stack cmd
	
	if the specified values and the specified operation is true, then it does its commands
	
	value 1 - first value
	
	operation - math operation to compare the 2 values, can be: =, !=, >, <
	
	value 2 - seccond value
	
iflst <list> <value>
	
	stack cmd
	
	checks to see if the specified value is in the specified list.  if so, it does its
	stacked commands
	
ifstr <string 1> <operation> <string 2>
	
	stack cmd
	
	compares the 2 specified strings
	
	operation - comparison, can be: =, !=
	
else

	stack cmd
	
	this must be inside a stacked 'if' command to work.  if the command fails, then
	this stack is done instead of the 'if' command stack.
	
	example:
	ifint "$var1$" "=" "$var2$"
		chat "var1 is equal to var2"
	else
		chat "var1 is not equal to var2"
	end

list <var name>
	external
	creates a new list var.  if the list already exists, the command does nothing
	
stop
	same as the 'return' command, except that the program will not process the chat string
	at any more responses, and will move on to the next chat string
	
var <var name> <default value>

	external
	
	creates a new variable with the default value
	
	if the variable already exists, it will override the variables value with the
	default value specified
	
end
	ends the current stack.  every stack command must have one of these at its end
	
chat <chat str>
	sends the specified chat to the game
	
tell <player> <message>
	sends the chat to the player by /tell
	
for <variable> <min> <max>
	
	stack cmd
	
	this will repeat the commands inside it once for every value of the variable from
	min to max, setting the variable to the value it is currently doing.
	
	example:
	
	for "i" "0" "7"
		chat "^$i$colors!"
	end
	
	this will chat:
	^0colors!
	^1colors!
	^2colors!
	^3colors!
	^4colors!
	^5colors!
	^6colors!
	^7colors!
	
cmd <command>
	sends the string to the server and executes it directly.  use this to send commands
	other than chat, or any mod specific commands
	
do <variable> <min> <max> <command>
	the precursor to the 'for' command, this is NOT a stack command, but directly does
	the specified commands (while still changing the variable to the current number)
	
	
	
along with the '$' var markers, you can also include functions
%FUNCTIONNAME:ARG%

current functions:

%time:0% - gets the current local time
%time:1% - gets the current gmt time

example:

response "$NAME$: !time"
	thread
		sleep "1000"
		chat "the time is %time:0%"
	end
end

response "$NAME$: !gmt"
	thread
		sleep "1000"
		chat "the gmt is %time:1%"
	end
end



%winamp:all% - gets a long string of info on the current song playing
%winamp:title% - returns the title of the current song
%winamp:song% - returns the current file path/name of the current song
%winamp:seek% - returns the number of milisecconds the song is at (to help with using the seek command)
%winamp:position% - returns the minutes/seconds the current song is at
%winamp:length% - returns the total minutes/secconds the current song has
%winamp:paused% - returns '1' for paused, '0' for not paused.  if the song is not being played.

	

---------------------------------------------------------------
	
	

There is a lot more I could do to this program, but i'll wait and see if people actualy care about it first.	
possible v2 features:
'event' responses (startup, winamp song stop, some others i cant think of now...)
make your own % functions
winAPI connection for connecting to and controling other programs 
	(would be a bit advanced, must have experiance at windows API to understand this)
support for windows media player and the ipod thingey... (if the winAPI stuff is included,
	you could add this yourself using the winAPI functions)
	
advanced, easier-to-use scripting. (I freely admit that my scripting system used in this
		program kinda sucks... it could be a LOT better)
MSN/AIM support:
	this is actualy in the program, but disabled.  It is working, but too chaotic for releace.



---------------------------------------------------------------


Anyway, thats basicly it.  my programming practice program which became too usefull for what it was indended to be.  If enough people like it, I will remake it with intentions of releacing it from day 1, so it will be a lot more stable (im suprised of how stable this version is, consitering all the major rewrites of different parts of it ive done) and definitely more user-friendly.

If there is a big enough demand, i might even make a drag-and-drop script creator 
interface.

oh, and if anyone wants it.  I can easily change a single string of text to make this
work in JK2




---------------------------------------------------------------



Just some random info on my example responsesSTANDALONE.cscr

before using the default response files, you must set a few vars:

#set your name here
var "NAME" ".:MOO:.Phred|MS|"
var "SHORTNAME" "Phred"

#set your music directory here
var "MusicDir" "C:\Base\multimedia files\sound"


SHORTNAME is basicly for players saying your name.  they most likely wont say hey, .:MOO:.Phred|MS|!, more likely, Hey, phred! (or possibly "Hey, m8", like someone just did now over msn while I was typing this...) only a few cmds use this, but its there if you want to add mroe (and you should add more, whats the point in getting this program if your not going to add your own commands?)



Remember, winamp isnt included in the program anymore, use JAMtracker with this program if you want music.
only reason winamp is still included here is it might be back in another version if enough people want it.



script will auto-set your name if you use the console /name blah cmdA	

lots of cmds ive made on a whim and several require admin on a lugormod server

_reward: <amount>   --requires lugormod admin and 'giveother'.  give anyone who kills
					you the specified amount of credits.  use again to shut off
					
!afk <msg>          --if anyone sends a private message to you, automaticly /tell them
					the msg set.  use again to shut off
	
!power			    --turns on/off kill tracking.  some (not all, i was too lazy) commands
					are shut off by this.
					
!hide				--minimises the jka window

!buddies			--list all buddies. will auto-greet any buddy who joins, and
					uses a different message when killing/killed by the buddy
					!buddies add <player name>
					!buddies remove <index>
					
!notes				--basic note system.  on reflection its kinda a poinless cmd, as
					you cant read notes when not in the game... meh
					!notes add <note>
					!notes list
					!notes remove <index>
					
!stats				--kills, deaths, ratio.  doesnt keep track of duels, but
					anyone can easily add that once they learn how to use the
					scripting.  (this was never intended to be a killtracker as such,
					it was indended to be a fully generic program which anyone can
					make it into whatever they want)
					
!time				--returns local time on your pc

!gmt				--paranoid that people will hunt you down in your sleep when they
					figure out what timezone you live in?  this cmd returns the
					GMT time, so you can get your time and they will send the assasins
					to Eroupe
					
_ampplay <song>		--debug cmd, plays the song specified (must include full file path)

_lasterror			--debug cmd, return last error (only used with winamp right now)

!songinfo			--everything you ever wanted to know about the current song

!title				--returns the... well... title of the song playing

!seek <secconds>	--resets the current songs position to the secconds given
					note that it will tell you it set it to 1 seccond over what
					you told it to. this is because ive included a 1 seccond delay
					on all chat responses (so it works on servers with sv_floodprotect
					turned on)
					
!fastforward		--no, this parts too early..PREPAIR TO FAST FORWARD!
					fast forwarding sir!
					
!volume				--sets the volume, from 0 to 255.  with a bit of math, anyone
					can turn this cmd to range it from 0 to 100, if 0 to 255 is too 
					confusing...
					
!play <song>		--plays the song.  it checks your MusicDir variable for the path,
					and works with partial names.
					
!pause				--makes the song play really, really fast
					either that or makes it stop playing... your guess is as good
					as mine
					
!stop				--OMFG STOP THE ROCK!!!!

_thread				--random cmd I made to test the multithreading stuff

_savelst			--debug cmd to save all list vars to a file.
					this is automaticly done in the script when the notes and buddies
					lists are changed
					
_todo: <msg>		--appends the msg to "todo.txt" at the same dir the program is 
					running	from.  basicly my version of !notes, but you can read it 
					outside the game, and its a heck of	a lot easier for me when 
					ideas randomly come
					
_setvar <var> <value> --debug cmd for setting variable values.  if you really wanted
					to be evil, you could do _setvar KILLS 50000
					but then again, it would be easier just to bind a key to say
					a fake !stats chat instead of going through the trouble of getting
					a chat scan to do it for you.
					
_getlst <list>		--another debug cmd, this time to list all objects in a list.

_testlst <list> <val> --debug, checks to see if the given value is in the given list.

_lstadd <list> <val> --debug, add the value to the list

_savevars			--debug, save all vars to a file.  this is done for you in the script
					whenever you get a kill or a death, or change your name, et al.
					
_console <0/1>		--this displays the "mp console", which is NOT the shift + ~ console,
					but is a console that is invisible normaly, and that this program
					reads the chat off of.  the reason it looks like it is blank is because
					the program deletes the text out of it every time it reads it, so the same
					chat doesnt repeatedly trigger a response.
					
_colors <msg>		--test of the 'for' stack function.  it chats the msg in every color

_bzz				--an old classic cmd from a very early chat scan I made once.
					it requires lugormod admin and access to the 'killother' cmd.
					if anyone says 'bzz', a lightning bolt comes out of knowwhere
					and kills the guy who said it.  for such a painful cmd, it seems
					to be fairly popular (especialy with players trying to get other
					players to say it.. hey, someone say 'b z z' but without the spaces!)

_varfunc <msg>		--completely pointless debug func.  all it does is say "test: <msg>"
					may not look like much, but it tests the chat line and
					response parsing. (also having a variable inside a function call)
					
!playlist			--part of a 'playlist' music player thing.  It works, but I never
					use it since the !play cmd takes care of things fine.
					do _updatepl to fill it up from the music dir if for some odd 
					reason you think this is better than !play
					!playlist -- lists the songs and indexes in playlist
					!playlist play <index> -- plays the song.
					
_updatepl			-- fills up the 'playlist' list from the music dir set in the
					MusicDir var (set near the top of response.txt)


	
	
	
	
	
	
	
	
	
Use this program at your own risk!
I will not be held reponsible for any damage done by using this program.  I am almost certain that the program will not wipe your harddrive or make your pc spontaniously combust, but stuff happens... and its not my fault.

So dont sue me.

THIS MODIFICATION IS NOT MADE, DISTRIBUTED, OR SUPPORTED BY ACTIVISION, RAVEN, OR 
LUCASARTS ENTERTAINMENT COMPANY LLC. ELEMENTS TM &  LUCASARTS 
ENTERTAINMENT COMPANY LLC AND/OR ITS LICENSORS. 